package msgcomm;

import msgcomm.messages.Message;

/**
 * Interfaccia che una classe deve implementare per poter ricevere dei messaggi
 */
public interface Receiver {

	/**
	 * Consegna il messaggio all'oggetto su cui viene invocato.
	 * In altre parole: attraverso questo metodo il messaggio viene inviato
	 * all'oggetto su cui viene invocato. L'implementazione di questo metodo deve
	 * quindi occuparsi della gestione della ricezione di questo messaggio.
	 * @param msg messaggio da consegnare
	 * @throws Exception generica eccezione nel consegnare il messaggio al destinatario
	 */
	public void receive(Message msg) throws Exception;
	
	/**
	 * Esegue una richiesta bloccante: il metodo non ritorna fino a quando non
	 * e' stata ottenuta la risposta
	 * @param msg il messaggio di richiesta
	 * @return il messaggio di risposta
	 * @throws Exception generica eccezione nel consegnare il messaggio
	 */
	public Message blockingReceive(Message msg) throws Exception;
	
	/**
	 * Consegna il messagio al ricevente e lo inoltra direttamente all'utente
	 * senza alcuna operazione intermedia (esegue cioe' sia il receive che il
	 * deliver)
	 * @param msg
	 * @throws Exception
	 */
	public void receiveAndDeliver(Message msg) throws Exception;
}
